<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="div1">
    <em>em文本</em>
    div文本
    <strong>strong文本</strong>
  </div>
  <script>
    var oDiv = document.getElementById("div1")

    // childNodes：访问当前节点下所有的子节点
    // firstChild：访问子节点中的第一个节点
    // lastChild：访问子节点中的最后一个节点
    // nextSibling：访问当前节点的下一个节点（也就是下面第一个兄弟节点）
    // previousSibling：访问当前节点的上一个节点（也就是上面第一个兄弟节点）
    // 【注】：上述这些属性都包含文本节点，包括标签与标签之间格式化之后留下的空格、回车、换行
    console.log(oDiv.childNodes.length);    // 5(里面包括了空格、回车、换行)
    console.log(oDiv.lastChild.previousSibling);

    // 以下这些跟上面的对应
    // 【注】：剔除了所有的文本节点，只留下了元素节点（IE8以下不兼容）
    // children
    // firstElementChild
    // lastElementChild
    // nextElementSibling
    // previousElementSibling
    console.log(oDiv.children.length);
    console.log(oDiv.lastElementChild.previousElementSibling);

    // 最后通过nodeName、nodeType、nodeValue来分别获取节点名、节点类型、节点值
    //           nodeType    nodeName    nodeValue
    // 元素节点       1        标签名        null
    // 属性节点       2        属性名       属性值
    // 文本节点       3        #text       文本内容
    console.log(oDiv.lastElementChild.previousElementSibling.nodeType);
    console.log(oDiv.lastChild.nodeName);
    console.log(oDiv.firstElementChild.nodeValue);
  </script>
</body>
</html>